home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 4 / QRZ Ham Radio Callsign Database - Volume 4.iso / files / dsp / 56ktools / dspkgctr.z / dspkgctr / gcc / config / out-vax.c < prev    next >
C/C++ Source or Header  |  1992-06-08  |  3KB  |  142 lines

  1. /* Subroutines for insn-output.c for Vax.
  2.    Copyright (C) 1987 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 1, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include <stdio.h>
  21.  
  22. print_operand_address (file, addr)
  23.      FILE *file;
  24.      register rtx addr;
  25. {
  26.   register rtx reg1, reg2, breg, ireg;
  27.   rtx offset;
  28.  
  29.  retry:
  30.   switch (GET_CODE (addr))
  31.     {
  32.     case MEM:
  33.       fprintf (file, "*");
  34.       addr = XEXP (addr, 0);
  35.       goto retry;
  36.  
  37.     case REG:
  38.       fprintf (file, "(%s)", reg_names[REGNO (addr)]);
  39.       break;
  40.  
  41.     case PRE_DEC:
  42.       fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);
  43.       break;
  44.  
  45.     case POST_INC:
  46.       fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);
  47.       break;
  48.  
  49.     case PLUS:
  50.       reg1 = 0;    reg2 = 0;
  51.       ireg = 0;    breg = 0;
  52.       offset = 0;
  53.       if (CONSTANT_ADDRESS_P (XEXP (addr, 0))
  54.       || GET_CODE (XEXP (addr, 0)) == MEM)
  55.     {
  56.       offset = XEXP (addr, 0);
  57.       addr = XEXP (addr, 1);
  58.     }
  59.       else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
  60.            || GET_CODE (XEXP (addr, 1)) == MEM)
  61.     {
  62.       offset = XEXP (addr, 1);
  63.       addr = XEXP (addr, 0);
  64.     }
  65.       if (GET_CODE (addr) != PLUS)
  66.     ;
  67.       else if (GET_CODE (XEXP (addr, 0)) == MULT)
  68.     {
  69.       reg1 = XEXP (addr, 0);
  70.       addr = XEXP (addr, 1);
  71.     }
  72.       else if (GET_CODE (XEXP (addr, 1)) == MULT)
  73.     {
  74.       reg1 = XEXP (addr, 1);
  75.       addr = XEXP (addr, 0);
  76.     }
  77.       else if (GET_CODE (XEXP (addr, 0)) == REG)
  78.     {
  79.       reg1 = XEXP (addr, 0);
  80.       addr = XEXP (addr, 1);
  81.     }
  82.       else if (GET_CODE (XEXP (addr, 1)) == REG)
  83.     {
  84.       reg1 = XEXP (addr, 1);
  85.       addr = XEXP (addr, 0);
  86.     }
  87.       if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT)
  88.     {
  89.       if (reg1 == 0)
  90.         reg1 = addr;
  91.       else
  92.         reg2 = addr;
  93.       addr = 0;
  94.     }
  95.       if (offset != 0)
  96.     {
  97.       if (addr != 0) abort ();
  98.       addr = offset;
  99.     }
  100.       if (reg1 != 0 && GET_CODE (reg1) == MULT)
  101.     {
  102.       breg = reg2;
  103.       ireg = reg1;
  104.     }
  105.       else if (reg2 != 0 && GET_CODE (reg2) == MULT)
  106.     {
  107.       breg = reg1;
  108.       ireg = reg2;
  109.     }
  110.       else if (reg2 != 0 || GET_CODE (addr) == MEM)
  111.     {
  112.       breg = reg2;
  113.       ireg = reg1;
  114.     }
  115.       else
  116.     {
  117.       breg = reg1;
  118.       ireg = reg2;
  119.     }
  120.       if (addr != 0)
  121.     output_address (offset);
  122.       if (breg != 0)
  123.     {
  124.       if (GET_CODE (breg) != REG)
  125.         abort ();
  126.       fprintf (file, "(%s)", reg_names[REGNO (breg)]);
  127.     }
  128.       if (ireg != 0)
  129.     {
  130.       if (GET_CODE (ireg) == MULT)
  131.         ireg = XEXP (ireg, 0);
  132.       if (GET_CODE (ireg) != REG)
  133.         abort ();
  134.       fprintf (file, "[%s]", reg_names[REGNO (ireg)]);
  135.     }
  136.       break;
  137.  
  138.     default:
  139.       output_addr_const (file, addr);
  140.     }
  141. }
  142.